/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Clube;

import Geral.ErroInternoException;
import java.io.Serializable;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

/**
 *
 * @author Ivaldo
 */
@Stateless
public class RepositorioClubeJPA implements IRepositorioClube, Serializable {
    
    @PersistenceContext
    private EntityManager em;
    
    public RepositorioClubeJPA(){
        this.em = Persistence.createEntityManagerFactory("HelpFitPU").createEntityManager();
    }

    @Override
    public void adicionar(Clube clube) throws ErroInternoException, ClubeExistenteException {
        try{
            this.em.persist(clube);
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }

    @Override
    public void Remover(long id_clube) throws ErroInternoException, ClubeInexistenteException {
        Clube c = buscarClube(id_clube);
        try{
            this.em.remove(c);
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }

    @Override
    public Clube buscarClube(long id_clube) throws ErroInternoException, ClubeInexistenteException {
        try{
            Clube c = this.em.find(Clube.class, id_clube);
            if(c == null){
                throw new ClubeInexistenteException();
            }
            return c;
        }catch(ClubeInexistenteException e){
            throw e;
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }

    @Override
    public void atualizar(Clube clube) throws ErroInternoException, ClubeInexistenteException {
        buscarClube(clube.getId());
        try{
            this.em.merge(clube);
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }

    @Override
    public List<Clube> listaClube() throws ErroInternoException {
        try{
            TypedQuery<Clube> listaClube = this.em.createQuery("SELECT c from Clube c", Clube.class);
            if(listaClube.getResultList().isEmpty()){
                throw new ClubeInexistenteException();
            }
            return listaClube.getResultList();
            
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }

    @Override
    public Clube loginClube(String login, String senha) throws ErroInternoException, ClubeInexistenteException {
        try{
            TypedQuery<Clube> query = this.em.createQuery("SELECT c FROM Clube c WHERE c.login = :login AND c.senha = :senha", Clube.class);
            query.setParameter("login", login);
            query.setParameter("senha", senha);
            return query.getSingleResult();
        }catch(NoResultException nre){
            throw new ClubeInexistenteException();
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }
    
}
